В С++ строка это массив символов который заканчивается нулем. К сожалению это не везде так. Например, в PASCAL по другому. Но COM объекты должны быть универсальные и получать и передавать сроки из любых сред разработки. Именно по этому COM реализует свой тип срок который называется базовым - BSTR.
typedef OLECHAR * BSTR;
Эта строка содержит символы UNICODE с префиксом из четырех байт в котором содержится длина. Хоть эта строка и похожа на обычную строку но для работы с ней следует использовать специальные функции. Например, нельзя использовать delete для удаление, или использовать стандартные функции работы со строками C.
Итак, создать строку можно с помощью функции SysAllocString. Удалить распределенную строку можно при помощи функции - SysFreeString.
Можно сказать, что BSTR это обычный OLECHAR*. Значит и функции преобразования будут работать, как с OLECHAR смотрим "Шаг 57 - OLECHAR в CHAR и обратно". Определение длины строки несколько опасно. Вообще то это строка которая должна оканчиваться нулем. Но внутри нее могут быть нули и потому для определения длины лучше использовать специальные функции. Для определения длины строки нужно использовать функцию
UINT SysStringLen ( BSTR bstr );
Вот так например.
void main()
{
BSTR bstr=SysAllocString(L"new string");
cout << SysStringLen(bstr) << endl;
SysFreeString(bstr);
}
В данному случае длина строки вернется 10 символов. Для замены строки нужно применять функцию
INT SysReAllocString ( BSTR FAR* pbstr, const OLECHAR FAR* psz );
Вот так например.
void main()
{
BSTR bstr=SysAllocString(L"new string");
SysReAllocString(&bstr,L"Hello");
cout << SysStringLen(bstr) << endl;
SysFreeString(bstr);
}
Но использование BSTR типа чревато ошибками, так как при использовании стандартных функций работ со строками могут быть ошибки. Код ниже прекрасно компилируется, но его выполнение приводит к ошибке доступа.
void main()
{
BSTR bstr=SysAllocString(L"test");
wcscpy(bstr,L"test test test");
SysFreeString(bstr);
}